/**
 * window.localStorage 浏览器永久缓存
 * @method set 设置永久缓存
 * @method get 获取永久缓存
 * @method remove 移除永久缓存
 * @method clear 移除全部永久缓存
 */
export const Local = {
	/**
	 * 设置永久缓存
	 * @param key	缓存标识
	 * @param val	缓存值
	 * @param life	有效期，单位秒
	 */
	set(key, val, life) {
		setData(key, val, life, window.localStorage)
	},
	// 获取永久缓存
	get(key) {
		return getData(key, window.localStorage)
	},
	// 移除永久缓存
	remove(key) {
		window.localStorage.removeItem(key);
	},
	// 移除全部永久缓存
	clear() {
		window.localStorage.clear();
	},
};

/**
 * window.sessionStorage 浏览器临时缓存
 * @method set 设置临时缓存
 * @method get 获取临时缓存
 * @method remove 移除临时缓存
 * @method clear 移除全部临时缓存
 */
export const Session = {
	/**
	 * 设置临时缓存
	 * @param key	缓存标识
	 * @param val	缓存值
	 * @param life	有效期，单位秒
	 */
	set(key, val,life) {
		setData(key,val, life, window.sessionStorage)
	},
	// 获取临时缓存
	get(key) {
		return getData(key, window.sessionStorage)
	},
	// 移除临时缓存
	remove(key) {
		window.sessionStorage.removeItem(key);
	},
	// 移除全部临时缓存
	clear() {
		window.sessionStorage.clear();
	},
};

export const StoreData = {
	/**
	 * 设置缓存
	 * @param key	缓存标识
	 * @param val	缓存值
	 * @param life	有效期，单位秒
	 * @param type	1: Session	2: Local
	 */
	set(key, val,life, type) {
		if (type === 1) {
			Session.set(key,val,life)
		} else {
			Local.set(key,val, life)
		}
	},
	// 获取缓存
	get(key, type) {
		if (type === 1) {
			Session.get(key)
		} else {
			Local.get(key)
		}
	},
	// 移除缓存
	remove(key, type) {
		if (type === 1) {
			Session.remove(key)
		} else {
			Local.remove(key)
		}
	},
	// 移除全部缓存
	clear(type) {
		if (type === 1) {
			Session.clear()
		} else {
			Local.clear()
		}
	},
}

/**
 * 数据缓存
 * @param key		缓存key
 * @param data		缓存数据
 * @param life		有效期，单位秒
 * @param subject	window.sessionStorage|window.localStorage
 */
function setData(key, data, life, subject) {
	if (!subject) {
		subject = window.sessionStorage;
	}
	if (life && life > 0) {
		const obj = {
			life: new Date().getTime() + 1000 * life,
			content: data
		}
		subject.setItem(key, JSON.stringify(obj));
	} else {
		subject.setItem(key, JSON.stringify(data));
	}
}

/**
 * 数据获取
 * @param key		缓存key
 * @param subject	window.sessionStorage|window.localStorage
 */
function getData(key, subject) {
	try {
		let json = subject.getItem(key);
		if (!json) {
			return undefined
		}
		let parse = JSON.parse(json);
		if (!parse) {
			subject.removeItem(key);
			return undefined
		}
		let keys = Object.keys(parse)
		if (keys.length === 2 && keys.includes('life') && keys.includes('life')) {
			// 提前3s失效
			let time = new Date().getTime() - 3 * 1000
			if (parse.life <= time) {
				// 过期了
				subject.removeItem(key);
				return undefined
			}
			return parse.content
		}
		return parse;
	} catch (e) {
		console.error('缓存读取异常',key, e)
	}
	return undefined;
}

